\chapter{Méthodologie}

\section{Etude de cas}
La démarche est expérimentale et basée sur une étude de cas. Elle utilise le benchmark atmosphérique HOMME (High Order Method Modeling Environment) \ref{homme} du NCAR (\textit{National Center for Atmospheric Research}) et effectue des tests sur deux supercalculateurs. Ce benchmark est une référence largement utilisée dans la communauté HPC et fait partie des cinq benchmarks requis pour le test d'acceptation d'un supercalculateur. Il s'agit d'un modèle général de circulation atmosphérique qui permet d'effectuer de la simulation 3D. Il a la particularité d'être très fortement scalable, et d'avoir une intensité arithmétique typique des codes de stencil. Il est écrit en \textit{Fortran 95} et parallélisé avec \textit{MPI} et \textit{OpenMP}. Pour les tests de l'étude, utilisation de la version parallélisée avec \textit{MPI} seulement.

\begin{figure}[htb]
	\begin{center}
		\includegraphics[width=7cm]{images/homme}		
		\caption{Exemple de modélisation atmosphérique obtenue avec HOMME}
		\label{homme}
	\end{center}
\end{figure}

\noindent La plupart des applications HPC peuvent être classifiées à l'aide de trois caractéristiques : 
\begin{enumerate}
	\item Les \emph{applications parallèles régulières} ont des \textit{patterns} de calcul et d'accès mémoire réguliers
	\item Les \emph{applications parallèles irrégulières} maintien d'une certaine localité grâce au \textit{blocking}, structures de données changeantes, \textit{meshes} adaptatifs...
	\item Les \emph{applications parallèles de graphes} sont dominées par les explorations du graphe et ne peuvent garantir de localité.
\end{enumerate}
HOMME est un exemple très diversifié et très sophistiqué représentatif des applications HPC dites régulières.
L'étude se concentre en particulier sur la scalabilité \textit{intranode}, à l'intérieur d'un noeud. Ce niveau de scalabilité est présent dans les trois catégories d'applications. 
Les résultats obtenus, pièges identifiées et optimisations, devraient s'appliquer de façon générale à toutes les applications régulières exécutées sur des \textit{clusters} de machines multicoeurs. 

\section{Clusters}
Les résultats présentés proviennent d'expérimentations effectuées sur deux \textit{clusters} : \textbf{Ranger} et \textbf{Longhorn}, tous deux localisés au \textit{Texas Advanced Computer Center}. 

\begin{figure}[htb]
	\begin{center}
		\includegraphics[width=7cm]{images/longhorn}
		\caption{Le cluster Longhorn}
		\label{longhorn}
	\end{center}
\end{figure}

\noindent Caractéristiques du \textit{cluster} Ranger (voir figure \ref{clusterR})
\begin{itemize}
	\item 3936 noeuds, 4 \textit{quad-core Opteron AMD Barcelona}
	\item 62 796 coeurs
	\item connexion InfiniBand
\end{itemize}

\noindent Caractéristiques du cluster Longhorn (voir figure \ref{longhorn})
\begin{itemize}
	\item 256 noeuds, 2 \textit{quad-core Intel Nehalem-EP}
	\item 2048 coeurs
	\item deux cartes NVIDIA Quadro FX 5800 désactivés pour cette étude
	\item connexion InfiniBand
\end{itemize}

Les mesures ont été effectuées en premier lieux sur Ranger, car il propose plus de 500 compteurs de performance \textit{hardware}. Elles ont ensuite été vérifiées sur Longhorn.

\section{Scalabilité du benchmark HOMME}

\subsection{Définitions}
L'application HOMME a été conçue pour être scalable, pouvoir passer l'échelle, sur des dizaines de milliers de noeuds. 
L'article s'intéresse à plusieurs types de scalabités: 
\begin{description}
    \item[scalabilité internode] entre deux plusieurs noeuds.
    \item[scalabilité intranode] à l'intérieur d'un noeud.
    \item[scalabilité intrachip] à l'intérieur d'un processeur, entre les différents coeurs.
    \item[scalabilité weak] évolution lorsque la charge de travail est fixe pour chaque coeur, mais que le nombre de coeurs augmente.
    \item[scalabilté strong] évolution lorsque la taille du problème est fixe, et que l'augmentation du nombre de coeurs fait diminuer la charge de travail de chaque coeur. 
\end{description}

La figure \ref{def} illustre les scalabilités \textit{intranode} et \textit{internode}.
\begin{figure}[htb]
	\begin{center}
		\includegraphics[width=\textwidth]{images/def}
		\caption{Scalabilités internode et intranode}
		\label{def}
	\end{center}
\end{figure}

Le principe de HOMME est le suivant : chaque noeud stocke les éléments nécessaires au calcul qu'il doit effectuer.  Il effectue les calculs, puis dans une étape de communication, échange les données frontalières avec ses quatre voisins, nord, sud, est et ouest. La quantité de mémoire disponible par noeud limite donc la quantité de calcul qui peut être effectuée sans communication. La métrique \textbf{EPC (Elements Per Core) } est utilisée pour caractériser cette quantité de données.

\subsection{Analyse de la scalabilité internode, strong et weak}
On s'intéresse donc ici uniquement aux communications qui sont effectuées entre les noeuds d'un \textit{cluster}. Pour isoler ces communications de celles qui ont lieu à l'intérieur, un seul coeur est activé par multiprocesseur.

Pour tester la scalabilité de type \emph{strong}, la taille totale du problème est fixée, et le nombre de coeurs est progressivement augmenté de 1 jusqu'à 1024. L'EPC par coeur diminue donc au fur et à mesure que le nombre de coeurs est augmenté, et les noeuds ont de plus en plus besoin de communiquer entre eux pour échanger les bords.

\begin{figure}[htb]
	\begin{center}
		\includegraphics[width=7cm]{images/internode}
		\caption{Scalabilté internode}
		\label{inter}
	\end{center}
\end{figure}
La courbe bleue de la figure \ref{inter} représente l'efficacité. Celle-ci diminue lentement,lorsque le nombre de noeuds augmente. Le fait que l'efficacité diminue lentement alors que la surcharge de communications augmente montre l'excellente  scalabilité \textit{strong} de l'application.

Pour tester la scalabilité de type \textit{weak}, la charge par coeur est fixée. L'EPC ne varie pas, mais le nombre de noeuds augmente, et donc les communications entre les noeuds aussi. La courbe rouge de la figure \ref{inter} montre que la scalabilité est quasiment linéaire et ne tombe jamais en-dessous de 94\%.

La scalibilité \textit{internode} de l'application HOMME est excellente. Il faut multiplier le nombre de noeuds par 900 avant que l'efficacité ne diminue de moitié. 

\subsection{Analyse de la scalabilité \textit{intranode}, \textit{strong} et \textit{weak}}
Pour analyser la scalabilité \textit{intranode} un seul noeud est utilisé. Le nombre de coeurs est progressivement augmenté de 1 jusqu'à 16. Il s'agit donc d'observer l'efficacité en fonction de l'augmentation des communications entre les processeurs d'un même noeud et entre les coeurs d'un même processeur.

\begin{figure}[htb]
	\begin{center}
		\includegraphics[width=6cm]{images/intranode}
		\includegraphics[width=6cm]{images/intra_zoom}
		\includegraphics[width=2cm]{images/intranode_colors}	
		\caption{Scalabilté intranode}
		\label{intra}
	\end{center}
\end{figure}

La figure \ref{intra} montre que la scalabilité \textit{weak} est à 60\% lorsque 16 coeurs par noeuds sont utilisés et que la scalabilité \textit{weak} augmente lentement jusqu'à 4 coeurs puis plafonne. Ces résultats montrent que la scalabilité \textit{intrachip/intranode} est un véritable frein à l'obtention de performances et qu'elle représente un enjeu très important pour l'avenir. En effet, si les processeurs \textit{quad-core} ne sont pas bien exploités, comment exploiter les processeurs 8, 16 et 32 coeurs de demain ?
